home *** CD-ROM | disk | FTP | other *** search
-
- TestMode = 01
-
- IncDir Includes:
- Include LVO/DOS_Lib.I
- Include LVO/Exec_Lib.I
- Include LVO/Graphics_Lib.I
- Include LVO/Intuition_Lib.I
-
- BaseReg BaseReg,a5
- ;------------------------------------------------------------
- Section Colorado,Code_P
-
- Start movem.l d1-a6,-(sp)
- lea.l BaseReg,a5
-
- moveq #36,d0
- lea.l DOSLib(a5),a1
- move.l $4.w,a6
- jsr _LVOOpenLibrary(a6)
- move.l d0,DOSBase(a5)
- beq.w End
- moveq #36,d0
- lea.l IntuiLib(a5),a1
- jsr _LVOOpenLibrary(a6)
- move.l d0,IntuiBase(a5)
- beq.b CloseAll
- moveq #36,d0
- lea.l GfxLib(a5),a1
- jsr _LVOOpenLibrary(a6)
- move.l d0,GfxBase(a5)
- beq.b CloseAll
- ;------------------------------------------------------------
- If TestMode=0
- ReadArgs: move.l #Template,d1
- move.l #TmpResult,d2
- moveq #0,d3
- move.l DOSBase(a5),a6
- jsr _LVOReadArgs(a6)
- move.l d0,TmpID(a5)
- bne.b .OpenPic
-
- pea CloseAll
- bra.w GetIOError
- EndIf
- ;------------------------------------------------------------
- .OpenPic bsr.w OpenILBM ; And load colormap
- bsr.w CheckForWBScr ; And setup colors
- bsr.w PaletteChange ; Setup Env:Palette.Prefs
- bsr.w PatternChange ; Setup Env:WBPattern.Prefs
-
- FreeArgs: If TestMode=0
- move.l TmpID(a5),d1
- move.l DOSBase(a5),a6
- jsr _LVOFreeArgs(a6)
- EndIf
-
- bsr.w PatchOpenScr
- ;------------------------------------------------------------
- CloseAll: move.l PrintErrorTxt,d2
- beq.b .NoErrors
- bsr.b PrintText
-
- .NoErrors bsr.b CloseAllFiles
-
- tst.l ReturnError(a5)
- bne.b .Error
-
- If TestMode=0
- move.l $4.w,a6
- move.l #4096,d0
- jsr _LVOWait(a6)
- move.l #QuitTxt,d2
- bsr.b PrintText
- Else
- move.l IntuiBase(a5),a6
- jsr _LVOCloseWorkBench(a6)
- .Debug bsr NewOpenCode
- EndIf
-
- .Error bsr.w UnPatch
- bsr.b FreeAllMem
- bsr.b CloseAllLibs
-
- End: move.l ReturnError(a5),d0
- movem.l (sp)+,d1-a6
- rts
- ;------------------------------------------------------------
- PrintText: moveq #0,d3
- move.l d2,a0
- .FindLength addq #1,d3
- tst.b (a0,d3.w)
- bne.b .FindLength
-
- .GetOutput move.l DOSBase(a5),a6
- jsr _LVOOutput(a6)
- move.l d0,d1
- move.l DOSBase(a5),a6
- jsr _LVOWrite(a6)
- rts
- ;------------------------------------------------------------
- CloseAllFiles: lea.l FilesToClose(a5),a3
- lea.l EndOfFiles(a5),a4
- move.l DOSBase(a5),a6
-
- .FreeLoop cmp.l a3,a4
- beq.b .NoFilesLeft
- move.l (a3)+,d1
- beq.b .FreeLoop
- jsr _LVOClose(a6)
- bra.b .FreeLoop
- .NoFilesLeft rts
- ;------------------------------------------------------------
- FreeAllMem: lea.l MemToFree(a5),a3
- lea.l EndOfAlloc(a5),a4
- move.l $4.w,a6
-
- .FreeLoop cmp.l a3,a4
- beq.b .NoMemLeft
- move.l (a3)+,a1
- move.l (a3)+,d0
- beq.b .FreeLoop
- jsr _LVOFreeMem(a6)
- bra.b .FreeLoop
- .NoMemLeft rts
- ;------------------------------------------------------------
- CloseAllLibs: lea.l LibsToClose(a5),a3
- lea.l EndOfLibs(a5),a4
- move.l $4.w,a6
-
- .FreeLoop cmp.l a3,a4
- beq.b .NoLibsLeft
- move.l (a3)+,a1
- cmp.l #$00,a1
- beq.b .FreeLoop
- jsr _LVOCloseLibrary(a6)
- bra.b .FreeLoop
- .NoLibsLeft rts
- ;------------------------------------------------------------
- GetIOError: move.l DOSBase(a5),a6
- jsr _LVOIoErr(a6)
- move.l d0,d1
-
- PrintFault: move.l d1,ReturnError(a5)
- move.l #ProgName,d2
- move.l DOSBase(a5),a6
- jmp _LVOPrintFault(a6)
- ;------------------------------------------------------------
- OpenILBM: move.l TmpResult(a5),d1
- move.l #1005,d2
- move.l DOSBase(a5),a6
- jsr _LVOOpen(a6)
- move.l d0,FileHandle(a5)
- bne.b .NameFromFH
- move.l #OpenFailErr,PrintErrorTxt(a5)
- move.l #CloseAll,(sp)
- bra.b GetIOError
-
- .NameFromFH move.l FileHandle(a5),d1
- move.l #RealName,d2
- move.l #256,d3
- jsr _LVONameFromFH(a6)
-
- .ReadID move.l #12,d3
- bsr.w Read
-
- cmp.l #"FORM",HeaderBuffer(a5)
- bne.w FileTypeError
- cmp.l #"ILBM",HeaderBuffer+8(a5)
- bne.w FileTypeError
-
- FindCMAP: moveq #8,d3
- bsr.w Read
- cmp.l #8,d0
- beq.b .Ok
- move.l #212,d1
- move.l #NoCMapErr,PrintErrorTxt(a5)
- bra.w FileTypeError|.General
- .Ok cmp.l #"CMAP",HeaderBuffer(a5)
- beq.b ReadCMAP
- cmp.l #"BODY",HeaderBuffer(a5)
- bne.b .NotABody
- st BodyCheck(a5)
- .NotABody move.l HeaderBuffer+4(a5),d2
- bsr.w Seek
- bra.b FindCMAP
-
- ReadCMAP: move.l HeaderBuffer+4(a5),d0
- move.l d0,ColorMapPnt+4(a5)
- moveq #0,d1
- move.l $4.w,a6
- jsr _LVOAllocMem(a6)
- move.l d0,ColorMapPnt(a5)
- bne.b .ReadCMAP
- clr.l ColorMapPnt+4(a5)
- move.l #103,d1
- move.l #CloseAll,(sp)
- bra.b FileTypeError|.General
-
- .ReadCMAP move.l FileHandle(a5),d1
- move.l ColorMapPnt(a5),d2
- move.l ColorMapPnt+4(a5),d3
- move.l DOSBase(a5),a6
- jsr _LVORead(a6)
- cmp.l ColorMapPnt+4(a5),d0
- beq.b .AllOk
-
- move.l #219,d1
- move.l #NoCMapErr,PrintErrorTxt(a5)
- bra.b FileTypeError|.General
-
- .AllOk tst.b BodyCheck(a5)
- bne.b .End
- .FindLoop move.l #8,d3
- bsr.b Read
- cmp.l #8,d0
- bne.b .End
- cmp.l #"BODY",HeaderBuffer(a5)
- beq.b .Found
- move.l HeaderBuffer+4(a5),d2
- bsr.b Seek
- bra.b .FindLoop
- .End rts
- .Found st BodyCheck(a5)
- bra.b .End
-
- FileTypeError: move.l #212,d1
- move.l #NotIFFErr,PrintErrorTxt(a5)
- .General move.l #CloseAll,(sp)
- bra.w PrintFault
- ;------------------------------------------------------------
- Read: move.l FileHandle(a5),d1
- move.l #HeaderBuffer,d2
- move.l DOSBase(a5),a6
- jsr _LVORead(a6)
- rts
-
- Seek: move.l FileHandle(a5),d1
- moveq #0,d3
- move.l DOSBase(a5),a6
- jsr _LVOSeek(a6)
- rts
- ;------------------------------------------------------------
- CheckForWBScr: move.l IntuiBase(a5),a0
- move.l 60(a0),a1
-
- .FindWBScr cmp.l #0,a1
- beq.w .NoOpenWB
-
- move.w 20(a1),d0
- and.b #$0f,d0
- cmp.b #$01,d0
- beq.b .FoundWB
- move.l (a1),a1
- bra.b .FindWBScr
-
- .FoundWB lea.l WBenchName(a5),a0
- move.l IntuiBase(a5),a6
- jsr _LVOLockPubScreen(a6)
- move.l d0,ScreenBase(a5)
-
- .GetDepth move.l ScreenBase(a5),a0
- move.l 88(a0),a0 ; RastPort->Bitmap
- move.b 5(a0),d2 ; Depth
- moveq #0,d3
- bset d2,d3
-
- move.l ColorMapPnt+4(a5),d2
- divu.w #3,d2
- move.w d2,PictureCols(a5)
- move.w d3,WBScrCols(a5)
- cmp.w d2,d3
- bge.b .TstFurther
- move.l #TooFewColErr,PrintErrorTxt(a5)
- move.w d3,d7
- sub.w #4+4+1,d7
- bpl.b .GetCMap
- bra.b .UnLockWBScr
- .TstFurther cmp.w #4,d2
- bls.b .UnLockWBScr
- cmp.w #8,d3
- bls.b .UnLockWBScr
-
- move.w d2,d7
- subq.w #1+4,d7
- cmp.w d2,d3
- bhi.b .GetCMap
- subq.w #4,d7
-
- .GetCMap move.l ScreenBase(a5),a1
- move.l 48(a1),a0
- lea.l (a0),a2
-
- .AttachExPal lea.l 44(a1),a1
- move.l GfxBase(a5),a6
- jsr _LVOAttachPalExtra(a6)
-
- move.l ColorMapPnt(a5),a3
- lea.l 12(a3),a3
- move.l GfxBase(a5),a6
- moveq #0,d4 ; Shared pens
- moveq #4,d6 ; Col Start number
-
- .ColorSetLoop bsr.b Precise
- move.l d0,d1
- bsr.b Precise
- move.l d0,d2
- bsr.b Precise
- move.l d0,d3
-
- move.l d6,d0
- lea.l (a2),a0
- jsr _LVOObtainPen(a6)
- tst.l d0
- bpl.b .Ok
- move.l d6,d0
- lea.l (a2),a0
- jsr _LVOReleasePen(a6)
- subq.w #3,a3
- bra.b .ColorSetLoop
- .Ok addq #1,d6
- dbf d7,.ColorSetLoop
-
- .UnLockWBScr sub.l a0,a0
- move.l ScreenBase(a5),a1
- move.l IntuiBase(a5),a6
- jsr _LVOUnlockPubScreen(a6)
-
- .NoOpenWB rts
-
- Precise: move.l d1,-(sp)
- moveq #0,d0
- move.b (a3)+,d0
- move.l d0,d1
- rol.l #8,d1
- add.l d1,d0
- move.w d0,d1
- swap d1
- add.l d1,d0
- move.l (sp)+,d1
- rts
- ;------------------------------------------------------------
- PaletteChange: move.l #PaletteName,d1
- lea.l PalPrefPnt(a5),a2
- bsr.w LoadEnv
- tst.b d0
- bmi.w .Error
-
- move.l PalPrefPnt(a5),a2
- cmp.l #"PREF",(a2)+
- bne.w PalError
- cmp.l #"PRHD",(a2)+
- bne.w PalError
- add.l (a2)+,a2
- cmp.l #"PALT",(a2)+
- bne.w PalError
- add.l #4+(4*4)+(32*2)+(32*2),a2
-
- move.l ColorMapPnt(a5),a3
- moveq #3,d7
- .ColorSetLoop lea.l 2(a2),a2
- moveq #2,d6
- .CanonSet moveq #0,d1
- move.b (a3),d1
- rol.l #8,d1
- add.b (a3)+,d1
- move.w d1,(a2)+
- dbf d6,.CanonSet
- dbf d7,.ColorSetLoop
-
- ; move.w WBScrCols(a5),d0
- ; cmp.w PictureCols(a5),d0
- ; bhi .OpenPalForWrt
- ; sub.w #4,d0
- ; mulu.w #3,d0
- ; move.l ColorMapPnt(a5),a3
- ; add.l d0,a3
-
- move.l ColorMapPnt+4(a5),d0
- sub.l #4*3,d0
- move.l ColorMapPnt(a5),a3
- add.l d0,a3
-
- moveq #3,d7
- .ColorSetLoop2 lea.l 2(a2),a2
- moveq #2,d6
- .CanonSet2 moveq #0,d1
- move.b (a3),d1
- rol.l #8,d1
- add.b (a3)+,d1
- move.w d1,(a2)+
- dbf d6,.CanonSet2
- dbf d7,.ColorSetLoop2
-
- .OpenPalForWrt move.l #PaletteName,d1
- move.l #1006,d2
- move.l DOSBase(a5),a6
- jsr _LVOOpen(a6)
- move.l d0,PalHandle(a5)
- bne.b .WriteHead
- move.l #NoPal,PrintErrorTxt(a5)
- bra.b .Error
- .WriteHead move.l PalHandle(a5),d1
- move.l #HeaderBuffer,d2
- moveq #8,d3
- jsr _LVOWrite(a6)
- .WriteRest move.l PalHandle(a5),d1
- move.l PalPrefPnt(a5),d2
- move.l HeaderBuffer+4(a5),d3
- jsr _LVOWrite(a6)
-
- .Error rts
-
- PalError: move.l #212,d1
- move.l #ErrPal,PrintErrorTxt(a5)
- move.l #CloseAll,(sp)
- bra.w PrintFault
- ;------------------------------------------------------------
- PatternChange: tst.l BodyCheck(a5)
- beq.w .Error
- move.l #WBPatternName,d1
- lea.l PtrnPrefPnt(a5),a2
- bsr.w LoadEnv
- tst.b d0
- bmi.w .Error
-
- move.l HeaderBuffer+4(a5),OldLength
-
- move.l PtrnPrefPnt(a5),a2
- cmp.l #"PREF",(a2)+
- bne.w PtrnError
- cmp.l #"PRHD",(a2)+
- bne.w PtrnError
- add.l (a2)+,a2
- move.l a2,ChangeHunk(a5)
- cmp.l #"PTRN",(a2)+
- bne.w PtrnError
- move.l (a2)+,d0
-
- btst #0,d0
- beq .Even
- addq #1,d0
- .Even
- sub.l d0,HeaderBuffer+4(a5)
- add.l a2,d0
- move.l d0,WBPatFurther(a5)
- add.l #(4*4),a2
- tst.w (a2)
- bne.w PtrnError
-
- lea.l RealName(a5),a0
- .Loop tst.b (a0)+
- bne.b .Loop
- sub.l #RealName,a0
- move.l a0,d0
-
- subq #1,d0
- move.w d0,PatternStart|.NameLength(a5)
- btst #0,d0
- beq.b .Fine
- addq.w #1,d0
- .Fine move.l d0,-(sp)
- add.l d0,PatternStart|.Length(a5)
- move.l PatternStart|.Length(a5),d0
- add.l d0,HeaderBuffer+4(a5)
-
- move.l #WBPatternName,d1
- move.l #1006,d2
- move.l DOSBase(a5),a6
- jsr _LVOOpen(a6)
- move.l d0,PtrnHandle(a5)
- bne.b .WriteHead
- move.l #NoWBP,PrintErrorTxt(a5)
- bra.b .Error
- .WriteHead move.l PtrnHandle(a5),d1
- move.l #HeaderBuffer,d2
- moveq #8,d3
- jsr _LVOWrite(a6)
-
- .WriteStart move.l PtrnHandle(a5),d1
- move.l PtrnPrefPnt(a5),d2
- move.l ChangeHunk(a5),d3
- sub.l d2,d3
- jsr _LVOWrite(a6)
-
- .WriteOwn move.l PtrnHandle(a5),d1
- move.l #PatternStart,d2
- moveq #8*4,d3
- jsr _LVOWrite(a6)
-
- .WriteName move.l PtrnHandle(a5),d1
- move.l #RealName,d2
- move.l (sp)+,d3
- jsr _LVOWrite(a6)
-
- .WriteLast move.l PtrnHandle(a5),d1
- move.l WBPatFurther(a5),d2
-
- move.l OldLength,d3
- move.l d2,d4
- sub.l PtrnPrefPnt(a5),d4
- sub.l d4,d3
- jsr _LVOWrite(a6)
-
- .Error rts
-
- PtrnError: move.l #212,d1
- move.l #ErrWBP,PrintErrorTxt(a5)
- move.l #CloseAll,(sp)
- bra.w PrintFault
- ;------------------------------------------------------------
- LoadEnv: move.l #1005,d2
- move.l DOSBase(a5),a6
- jsr _LVOOpen(a6)
- move.l d0,EnvHandle(a5)
- bne.b .ReadHead
- move.l #NoEnv,PrintErrorTxt(a5)
- bra.b .Error
-
- .ReadHead move.l EnvHandle(a5),d1
- move.l #HeaderBuffer,d2
- moveq #8,d3
- jsr _LVORead(a6)
-
- .AllocMem move.l HeaderBuffer+4(a5),d0
- move.l d0,4(a2)
- moveq #0,d1
- move.l $4.w,a6
- jsr _LVOAllocMem(a6)
- move.l d0,(a2)
- bne.b .ReadPref
- clr.l 4(a2)
- move.l #103,d1
- move.l #CloseAll,4(sp)
- move.l #PrintFault,(sp)
- bra.b .Error
-
- .ReadPref move.l EnvHandle(a5),d1
- move.l (a2),d2
- move.l HeaderBuffer+4(a5),d3
- move.l DOSBase(a5),a6
- jsr _LVORead(a6)
-
- .CloseFile move.l EnvHandle(a5),d1
- move.l DOSBase(a5),a6
- jsr _LVOClose(a6)
- clr.l EnvHandle(a5)
-
- moveq #0,d0
- rts
-
- .Error st d0
- rts
- ;------------------------------------------------------------
- PatchOpenScr: If TestMode=0
- move.l #NewOpenCode,d0
- move.l #_LVOOpenScreenTagList,a0
- move.l IntuiBase(a5),a1
- move.l $4.w,a6
- jsr _LVOForbid(a6)
- jsr _LVOSetFunction(a6)
- move.l d0,NewOpenCode|.CallOldCode+2
- jsr _LVOCacheClearU(a6)
- jsr _LVOPermit(a6)
- EndIf
- rts
- ;------------------------------------------------------------
- NewOpenCode:
-
- If TestMode=0
- .CallOldCode jsr $0
- Else
- move.l IntuiBase(a5),a6
- jsr _LVOOpenWorkBench(a6)
- EndIf
-
- tst.l d0
- beq.w .Fail
-
- movem.l d0-a6,-(sp)
-
- .Debug lea.l BaseReg,a5
-
- .TstWBScr move.l (sp),a0
- move.w 20(a0),d0 ; Screen->Flags
- and.w #$0f,d0
- cmp.w #$01,d0
- bne.b .Bummer
- .GetDepth move.l 88(a0),a0 ; RastPort->Bitmap
- move.b 5(a0),d2 ; Depth
- moveq #0,d3
- bset d2,d3
-
- move.l ColorMapPnt+4(a5),d2
- divu.w #3,d2
- cmp.w d2,d3
- blo.b .Bummer
- cmp.w #4,d2
- bls.b .Bummer
- cmp.w #8,d3
- bls.b .Bummer
-
- move.w d2,d7
- subq.w #1+4,d7
- cmp.w d2,d3
- bhi.b .GetCMap
- subq.w #4,d7
-
- .GetCMap move.l (sp),a1
- move.l 48(a1),a0
- lea.l (a0),a2
- .AttachExPal lea.l 44(a1),a1
- move.l GfxBase(a5),a6
- jsr _LVOAttachPalExtra(a6)
-
- move.l ColorMapPnt(a5),a3
- lea.l 12(a3),a3
- move.l GfxBase(a5),a6
- moveq #0,d4 ; Shared pens
- moveq #4,d6 ; Col Start number
-
- .ColorSetLoop bsr.w Precise
- move.l d0,d1
- bsr.w Precise
- move.l d0,d2
- bsr.w Precise
- move.l d0,d3
- move.l d6,d0
- lea.l (a2),a0
- jsr _LVOObtainPen(a6)
- addq #1,d6
- dbf d7,.ColorSetLoop
-
- ; bsr PaletteChange
-
- .Bummer movem.l (sp)+,d0-a6
-
- .Fail rts
- ;------------------------------------------------------------
- UnPatch: If TestMode=0
- move.l NewOpenCode|.CallOldCode+2,d0
- beq.b .NoPatch
- move.l #_LVOOpenScreenTagList,a0
- move.l IntuiBase(a5),a1
- move.l $4.w,a6
- jsr _LVOForbid(a6)
- jsr _LVOSetFunction(a6)
- jsr _LVOCacheClearU(a6)
- jsr _LVOPermit(a6)
- .NoPatch EndIf
- rts
- ;------------------------------------------------------------
- Section Data,Data_P
-
- BaseReg: dc.b "$VER: Colorado V0.6 (15-Jul-95) Allan Odgaard",0
- DOSLib: dc.b "dos.library",0
- GfxLib: dc.b "graphics.library",0
- IntuiLib: dc.b "intuition.library",0
- ProgName: dc.b "Colorado",0
- WBenchName: dc.b "Workbench",0
- PaletteName: dc.b "Env:Sys/Palette.Prefs",0
- WBPatternName: dc.b "Env:Sys/WBPattern.Prefs",0
- Template: dc.b "BackGround/A",0
-
- If TestMode=1
- BackGround:
- ; dc.b "DH0:Tools/Visual/PPaint_Prefs/MagicRomani.Pal",0
- ; dc.b "HardDisk:T/WBPic.Green-Dragon",0
- ; dc.b "HardDisk:T/WBPic.Blue-Dragon",0
- ; dc.b "HardDisk:T/Trine.MagicWB",0
- dc.b "HardDisk:T/WBPic.Nude-Girls!",0
- EndIf
-
- PalName: dc.b "Env:Sys/Palette.Prefs",0
- PtrnName: dc.b "Env:Sys/WBPattern.Prefs",0
-
- OpenFailErr: dc.b "Couldn't open the specified background picture",10,0
- NotIFFErr: dc.b "The specified background picture is not IFF/ILBM",10,"Or has an error in its format",10,0
- NoCMapErr: dc.b "The file contains no colormap specifications",10,0
- TooFewColErr: dc.b "The image has more colors than your WorkBench",10,0
- NoEnv: dc.b "Couldn't open Env:Sys/(Palette|WBPattern).Prefs",10,0
- NoPal: dc.b "Couldn't modify Env:Sys/(Palette.Prefs",10,0
- NoWBP: dc.b "Couldn't modify Env:Sys/WBPattern.Prefs",10,0
- ErrPal: dc.b "Env:Sys/Palette.Prefs seems to be smashed",10,0
- ErrWBP: dc.b "Env:Sys/WBPattern.Prefs seems to be smashed",10,0
- QuitTxt: dc.b "Ups... You just quited Colorado!",10,0
-
- Even
-
- PatternStart: dc.b "PTRN"
- .Length dc.l 6*4
- dcb.l 4
- .Which dc.w $0000
- .Flags dc.w $0010
- .Revision dc.b 0
- .Depth dc.b 0
- .NameLength dc.w 0
-
- If TestMode=1
- TmpResult: dc.l BackGround
- Else
- TmpResult: ds.l 1
- EndIf
-
- LibsToClose:
- DOSBase: ds.l 1
- GfxBase: ds.l 1
- IntuiBase: ds.l 1
- EndOfLibs:
-
- FilesToClose:
- FileHandle: ds.l 1
- EnvHandle: ds.l 1
- PtrnHandle: ds.l 1
- PalHandle: ds.l 1
- EndOfFiles:
-
- MemToFree:
- ColorMapPnt: ds.l 2
- PtrnPrefPnt: ds.l 2
- PalPrefPnt: ds.l 2
- EndOfAlloc:
-
- PictureCols: ds.w 1
- WBScrCols: ds.w 1
- TmpID: ds.l 1
- OldOpenScr: ds.l 1
- ScreenBase: ds.l 1
- DrawInfo; ds.l 1
- ColorMap: ds.l 1
- ChangeHunk: ds.l 1
- WBPatFurther: ds.l 1
- OldLength: ds.l 1
-
- BodyCheck: ds.l 1
-
- HeaderBuffer: ds.l 3 ; FORM lngh ILBM
-
- PrintErrorTxt: ds.l 1
- ReturnError: ds.l 1
-
- WBTags: ds.l 25
- RealName: ds.b 256
-
- -k - "J»